package br.edu.ufcg.unknown.sintatico;

import java.io.File;
import java.util.Map;

import br.edu.ufcg.unknown.exception.UnknownException;
import br.edu.ufcg.unknown.lexico.Token;
import br.edu.ufcg.unknown.lexico.UnknownTest;

public class TabelaDeSimbolosTest extends UnknownTest {

	private TabelaDeTokens tabela;

	private File palavrasReservadas = new File("resources" + File.separator + "palavras-reservadas.txt");

	@Override
	protected void setUp() throws Exception {
		super.setUp();
		assertTrue(palavrasReservadas.exists());
	}

	public void testConstrutorBaseadoNoArquivoDeTokens() {

		Token tokenAND = new Token("AND", "t_ident", "t_and", true);
		tokenAND.setCodigo(1);
		Token tokenMAIS = new Token("+", "t_operador", "t_mais", true);
		tokenMAIS.setCodigo(27);
		Token tokenFECHA_PAR = new Token(")", "t_parentisador", "t_fecha_par", true);
		tokenFECHA_PAR.setCodigo(39);
		Token tokenPTO_VGL = new Token(";", "t_sinal_pontuacao", "t_pto_vgl", true);
		tokenPTO_VGL.setCodigo(45);

		try {
			tabela = new TabelaDeTokens(palavrasReservadas);

			Map<String, Token> tabelaDeSimbolos = tabela.getTabela();

			assertEquals(45, tabelaDeSimbolos.size());
			assertTrue(tabelaDeSimbolos.containsKey(tokenAND.getLexema()));
			assertTrue(tabelaDeSimbolos.containsKey(tokenMAIS.getLexema()));
			assertTrue(tabelaDeSimbolos.containsKey(tokenFECHA_PAR.getLexema()));
			assertTrue(tabelaDeSimbolos.containsKey(tokenPTO_VGL.getLexema()));
			assertEquals(tokenAND, tabelaDeSimbolos.get(tokenAND.getLexema()));
			assertEquals(tokenMAIS, tabelaDeSimbolos.get(tokenMAIS.getLexema()));
			assertEquals(tokenFECHA_PAR, tabelaDeSimbolos.get(tokenFECHA_PAR.getLexema()));
			assertEquals(tokenPTO_VGL, tabelaDeSimbolos.get(tokenPTO_VGL.getLexema()));

		} catch (UnknownException e) {
			fail("Erro! Não era pra ter sido lançada exceção lendo arquivo de tokens bem formado!");
		}

	}

	public void testResolverToken() throws UnknownException {
		Token tokenAND = new Token("AND", "t_ident");
		Token tokenIDENTIFICADOR = new Token("meuIdentificador", "t_ident");

		tabela = new TabelaDeTokens(palavrasReservadas);

		tabela.resolverToken(tokenAND);
		assertEquals("t_and", tokenAND.getNome());
		assertEquals(1, tokenAND.getCodigo());
		assertTrue(tokenAND.ehPalavraReservada());

		tabela.resolverToken(tokenIDENTIFICADOR);
		assertEquals("meuIdentificador", tokenIDENTIFICADOR.getNome());
		assertEquals(tabela.codigo_t_ident, tokenIDENTIFICADOR.getCodigo());
		assertFalse(tokenIDENTIFICADOR.ehPalavraReservada());
	}

}
